package com.koala.learn.reflectlearn;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

/**
 * 反射的学习
 * tag 反射
 * 参考 https://www.cnblogs.com/cs-lcy/p/7397955.html
 * @author yantingrui
 * @date 2021/12/8   15:03
 */
public class Info {

    @Test
    void test(){

    }

    /**
     * 传入包名获得class对象
     */
    @Test
    void test1() throws ClassNotFoundException {
        Class<?> cls = Class.forName("com.koala.entity.Person"); // 取得Class对象
    }

    /**
     *  获得对象，构造方法，普通方法，属性
     */
    @Test
    void test2() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        Class<?> cls = Class.forName("com.koala.entity.Person"); // 取得Class对象
        // 只能无参构造 有参数构造需要指定每个域的类型
        Object obj = cls.newInstance(); //反射实例化对象
        // 参数需要传入 所以的属性.class 这个才能有参数构造
        Constructor<?> cons = cls.getConstructor(String.class, Integer.class, LocalDateTime.class, List.class);//获得构造方法
//        Object obj = cons.newInstance("张三", 20); // 为构造方法传递参数
        Method m3 = cls.getDeclaredMethod("getName"); //获得get方法
//        m.invoke(obj);//输出123456789，这个obj可以是new出来的或newInstance出来的
        Field nameField = cls.getDeclaredField("name"); // 获得name属性

//        System.out.println(obj);
//        System.out.println(o.toString());
        System.out.println(cons);
        System.out.println(m3);
        System.out.println(nameField);
    }

    @Test
    void test3(){

    }



}
